閱讀前,建議可以參考Day1:閱讀指南&為何選擇這個題目?
題目:計算機概論X30天
挑戰內容:連續30天紀錄計算機概論、離散數學、演算法、資料結構等課程的學習內容。
本篇性質:適合任何對程式語言有興趣的人閱讀
Alan Peris(首屆圖靈獎的獲得者)曾說過「一個語言如果不改變你的思考方式,就不值得學」 (A language that doesn’t affect the way you think about programming, is not worth knowing.)
初次看到這句話時,我的反應是這樣的:
究竟——「一個語言是否能夠改變你的思考方式?」
要回答這個問題,可能要先從程式語言的本質開始談起
什麼是程式語言?是說C/C++、Java、JavaScrpt、Phython、Haskll ....嗎?
沒錯,這些都是程式語言的其中一種,可是我想問的不是「程式語言有哪些?」
我想問的是「程式語言的本質究竟是什麼?」
程式語言語言是由什麼組成的?
不就是一堆符號嗎?(像是if、while、int、1、2、3)?
沒錯,說穿了
程式語言的本質,其實就是一堆符號組成的
符號系統
。
最初會有符號的出現,是因為我們有想要描述的東西。
比如說一個原始人第一次看到牛
他很驚訝,於是就把牛畫在紙上拿回去給其他人看(不要糾結以前怎麼會有紙還有筆),並且指著牛的圖案跟他的家人說「你看!外面有這種奇怪的動物。」。
備註:這個牛是原始人畫的,絕對不是我。
那這個故事中,「牛的圖案」就是一種符號
,它是為了表述「牛」這個現實物件
。可是我們會說「牛的圖案」完全等於「牛」嗎?不會,因為所謂的「牛的圖案」,只是是原始人對牛進行抽象化
的結果。
抽象化是什麼?抽象化就是一種「選擇」
比如說,當原始人把牛畫下來的時候,他就已經做出了選擇。
咦!?有嗎?什麼時候?他做了什麼選擇什麼?
他在繪畫的時候,選擇了要保留or刪除什麼資訊
。
當原始人在畫畫的時候:
這個原始人其實是從一個完整的牛身上刪除了大量資訊(重量、顏色、毛),抽象出了他留下最重要的資訊,也就是線條與輪廓。
完整的牛被抽象成了線條、輪廓(這是原始人畫的)
因此,我說抽象化式是一種選擇,
並且,抽象化是對現實資料做重要、不重要的選擇
抽象化很常見,我們在日常生活幾乎每天都會「抽象化」的取捨,只是我們沒有意識到而已。
有天,小A、小B、小C、小D去餐廳吃飯,於是服務生邊數著邊說「1、2、3、4」(請原諒服務生算數能力比較差,要慢慢指)「一共4位嗎?好的,請跟我來。」
但仔細想想看,這件事很奇怪。這四個人是如此的不同,他們到底要如何「加在一起」?
(以下是ABCD的個資)
這四個人從身高、體重、年齡...都相當不同,他們到底要如何「加再一起」?但服務生做到了,為什麼他做到了?
因為他捨棄了除了「數量」之外的所有資訊維度。
在服務生用「1+1+1+1=4 」這套符號系統進行運算時,
這裡的「等號(=)」具有一個神聖的地位,它宣告了
在這個情境中最重要的資訊是「數量」這個資訊,而不是其他任何東西(身高、體重)
小學的時候老師就教過我們交換率。老師說「1+2=2+1」,但可能有一些人曾經想過
沒錯,事實上他們位置就是不ㄧ樣。因此交換率致所以可以成立,因為背後存在一個預設
,這個預設也做了對資訊選擇。
當我們說「1+2=2+1」時,這裡的,「等號(=)」具有個神聖的地位,它宣告了一件事,那就是
在這個公式中,重要的「數量」這個資訊,至於「位置」是不重要的。
(以下舉一些例子)
繪畫經過抽象化:當原始人把牛畫下來時,他捨棄了牛身上的有多少毛、牛的顏色、牛的重量....這些資訊。
語言經過抽象化:當我們說「殺人是(等同)錯誤的」,這裡的等同(=)也是一種選擇,他反映了一種對特定價值觀的選擇——也就是的「不可以殺人」的這個道德規則比「個人的喜好」來得更重要。
紀錄經過抽象化:我平時會在電腦記下每時段在做的事情。當我做記錄這個動作時,我其實也做了選擇。比如說我可能在10~11點寫上「認真上課」但我在這個時段當中其實不只做了這些事情,我還做了「喝水」、「呼吸」、「坐著」這些事情。但是我不會把這些事情記上去
開始進入正題「一個語言如果不改變你的思考方式,就不值得學?」嗎?
小時後,語言老師也常說類似的話「每種語言,背後反映的是不同的價值觀」(這個老師可能是個日文、英文、法文老師...之類的)。
可是為什麼語言可以反映不同的價值觀?
以前我不懂,只覺得老師在說一些很空虛、不明覺厲的東西。但是,當我理解抽象化是一種對現實資料做重要/不重要的選擇時,我就明白了。
因為每種語言「覺得重要」的資訊不ㄧ樣,因此,每種語言反應的價值觀當然也不太ㄧ樣。
(沒修過邏輯的人可以跳過這個例子,因為你不知道我在說什麼,但其實我也不知道我在說什麼)
我們日常生活中常常使用「邏輯」這個詞,可是如果去研究「邏輯」這門學科,可以發現邏輯系統「不只一種」。
Propositional logic(語句邏輯):就是我們最常見的「p->q,非q則非P」的那種邏輯(大家多少都看過)
Predicate logic(述詞邏輯):覺得語句邏輯可以描述的東西太少了,因此多了存在、所有這些資訊維度。
Modal logic(模態邏輯): 引入了可能、或許、可以、一定、必然的概念
(還有許多其他的)
為什麼會分為這麼多不同的邏輯系統?
因為每個系統想要強調的概念都不一樣
回到程式語言,程式語言本身也是一堆符號組合的符號系統。而是每個程式語言抽象化的重點都不ㄧ樣
比如說:
PS.大部分的語言其實都不是純物件、純函式
所以回到最初的那個問題「為什麼一個語言可以改變你思考的方式?」
Alan Peris(首屆圖靈獎的獲得者)「一個語言如果不改變你的思考方式,就不值得學」 (A language that doesn’t affect the way you think about programming, is not worth knowing.)
理解了「抽象化」、「程式語言的本質後」我們可以得出答案
——因為不同語言對重要、不重要的資訊選擇不同
,看待世界的方式不同。因此在撰寫該語言的過程中,自然就能改變你的思考模式。
每一種語言,其實都是一種對資訊的選擇
每一種語言,都是一種看待世界的方式
什麼是符號?符號是主體對「現實」進行「抽象化」的結果,例如:牛(現實)VS牛的圖案(符號)
什麼是「抽象化」?抽象化是對眾多資訊進行重要、不重要的選擇過程。例如:把牛畫成圖的過程中就經過了抽象化(捨去了主觀認為不重要的資訊)
什麼是程式語言?「程式語言」其實就是一堆符號組合的符號系統。(常見符號系統包含:中文、英文、數學、邏輯)
不同程式語言差在哪裡?其實都是描述的一種方式,只是不同語言關注的重點、描述的方式不ㄧ樣。
「一個語言如果不改變你的思考方式,就不值得學」
被這句話吸引進來,哈哈哈
覺得蠻有道理,除了第一個語言,第二個之後都是學概念,如果第二個語言沒有特別的地方,那就只是花時間熟悉語法而已,不會有很大的收穫。
少了問號(?), 會變成直述句
好欣賞這篇對「程式語言」的本質的思路及論述過程,
對於一個概念的確認,
用更多的基本而有共識的實例及概念鋪陳架構起來。
可以把哲學上的基本概念,
來檢視程式語言的基本議題,
實在是少有這樣的視角來看待日常習以為常的事務。
最後一個連結無效,重追一下是:
https://www.codenewbie.org/blogs/object-oriented-programming-vs-functional-programming
原來是句號被寫入了URL裡。
才剛看完第二篇各種喪志...
程式學不好是不是因為自己沒有改變思考方式==
可是要怎麼改變思考方式?
思考方式又不是參考指南書
看一看做一做可以有成效的
感覺只能打掉重練QQ